/****************************************************************************
** @brief
****************************************************************************/

#ifndef CONTROLLER_H
#define CONTROLLER_H

#include <QThread>

#include "../../controller/controller_protocol_data_def.h"

class ControllerParserMain : public QThread
{
    Q_OBJECT

public:
    explicit ControllerParserMain(QObject *parent = nullptr);
    ~ControllerParserMain();

    //cmd
    static bool StopChargingService(quint8 gunno);
    static void SetStopChargingService(quint8 gunno);
    static void ClearStopChargingService(quint8 gunno);

    /**********************************************************************帧信息**********************************************************************/

    static con_frame_info_t con_frame_info[0xFF];

    /**********************************************************************命令帧**********************************************************************/

    /* 充电启动帧应答 */
    static con_feedback_start_charg_t con_feedback_start_charg[CON_MAX_PORT_NUM];

    /* 充电停止帧应答 */
    static con_feedback_stop_charg_t con_feedback_stop_charg[CON_MAX_PORT_NUM];

    /* 强制启动帧应答 */
    static con_feedback_startup_force_t con_feedback_startup_force[CON_MAX_PORT_NUM];

    /* 对时帧应答 */
    static con_feedback_time_sync_t con_feedback_time_sync[CON_MAX_PORT_NUM];

    /* 版本校验帧应答 */
    static con_feedback_version_check_t con_feedback_version_check[CON_MAX_PORT_NUM];

    /* 电子锁控制帧应答 */
    static con_feedback_lock_ctrl_t con_feedback_lock_ctrl[CON_MAX_PORT_NUM];

    /* 功率调节帧应答 */
    static con_feedback_power_ctrl_t con_feedback_power_ctrl[CON_MAX_PORT_NUM];

    /* 系统参数读取帧应答 */
    static con_feedback_sys_get_t con_feedback_sys_get[CON_MAX_PORT_NUM];

    /* 系统参数配置帧应答 */
    static con_feedback_sys_set_t con_feedback_sys_set[CON_MAX_PORT_NUM];

    /* 获取充电前车辆信息帧应答 */
    static con_feedback_carinfo_t con_feedback_carinfo[CON_MAX_PORT_NUM];

    /* 升级启动应答帧 */
    static con_feedback_start_update_t con_feedback_start_update;

    /* 升级数据应答帧 */
    static con_feedback_update_data_t con_feedback_update_data;

    /* 升级结果帧请求 */
    static con_update_result_t con_update_result;

    /* 系统自检应答帧 */
    static con_feedback_system_check_t con_feedback_system_check;

    /**********************************************************************状态帧**********************************************************************/

    /* 启动充电结果帧请求 */
    static con_charg_start_result_t con_charg_start_result[CON_MAX_PORT_NUM];

    /* 停止充电结果帧请求 */
    static con_charg_stop_result_t con_charg_stop_result[CON_MAX_PORT_NUM];

    /**********************************************************************数据帧**********************************************************************/

    /* 遥测帧请求 */
    static con_telemetry_t con_telemetry[CON_MAX_PORT_NUM];

    /* 遥信帧请求 */
    static con_telecommand_t con_telecommand[CON_MAX_PORT_NUM];

    /**********************************************************************心跳帧**********************************************************************/

    /* 心跳帧应答 */
    static con_feedback_heartbeat_t con_feedback_heartbeat[CON_MAX_PORT_NUM];

    /**********************************************************************错误帧**********************************************************************/

    /* 充电控制器错误帧请求 */
    static con_controller_error_t con_controller_error[CON_MAX_PORT_NUM];

    /*************************************************************************************************************************************************/

protected:
    void run() Q_DECL_OVERRIDE;

private:
    bool m_quit;
    unsigned long m_cycle = 10;

    //cmd - flag
    static QList<bool> stop_charging_service_;

signals:

public slots:

private slots:

};

class ControllerRecvMain : public QThread
{
public:
    explicit ControllerRecvMain(QObject *parent = nullptr);
    ~ControllerRecvMain();

    static bool reset()
    {
        return reset_;
    }

protected:
    void run() Q_DECL_OVERRIDE;

private:
    bool m_quit;
    unsigned long m_cycle;

    static bool reset_;

signals:

public slots:

private slots:

};

class ControllerSendMain : public QThread
{
    Q_OBJECT

public:
    explicit ControllerSendMain(QObject *parent = nullptr);
    ~ControllerSendMain();

    ///
    /// \brief timestamp_ms
    /// \return
    ///
    static quint64 timestamp_ms();

    /****************************************************************heartbeat fault*****************************************************************/

    static int heartbeat_count()
    {
        return heartbeat_count_;
    }
    static void set_heartbeat_count(const int value)
    {
        heartbeat_count_ = value;
    }

    /**********************************************************************帧信息**********************************************************************/

    static con_frame_info_t con_frame_info[0xFF];

    /**********************************************************************命令帧**********************************************************************/

    /* 充电启动帧请求 */
    static con_start_charg_t con_start_charg[CON_MAX_PORT_NUM];

    /* 充电停止帧请求 */
    static con_stop_charg_t con_stop_charg[CON_MAX_PORT_NUM];

    /* 强制启动帧请求 */
    static con_startup_force_t con_startup_force[CON_MAX_PORT_NUM];

    /* 对时帧请求 */
    static con_time_sync_t con_time_sync[CON_MAX_PORT_NUM];

    /* 版本校验帧请求 */
    static con_version_check_t con_version_check[CON_MAX_PORT_NUM];

    /* 电子锁控制帧请求 */
    static con_lock_ctrl_t con_lock_ctrl[CON_MAX_PORT_NUM];

    /* 功率调节帧请求 */
    static con_power_ctrl_t con_power_ctrl[CON_MAX_PORT_NUM];

    /* 系统参数配置帧请求 */
    static con_sys_get_set_t con_sys_get_set[CON_MAX_PORT_NUM];

    /* 获取充电前车辆信息帧请求 */
    static con_carinfo_t con_carinfo[CON_MAX_PORT_NUM];

    /* 升级启动请求帧 */
    static con_start_update_t con_start_update;

    /* 升级数据请求帧 */
    static con_update_data_t con_update_data;

    /* 系统自检请求帧 */
    static con_system_check_t con_system_check;

    /**********************************************************************状态帧**********************************************************************/

    /* 启动充电结果帧应答 */
    static con_feedback_charg_start_result_t con_feedback_charg_start_result[CON_MAX_PORT_NUM];

    /* 停止充电结果帧应答 */
    static con_feedback_charg_stop_result_t con_feedback_charg_stop_result[CON_MAX_PORT_NUM];

    /**********************************************************************心跳帧**********************************************************************/

    /* 心跳帧请求 */
    static con_heartbeat_t con_heartbeat[CON_MAX_PORT_NUM];

    /**********************************************************************错误帧**********************************************************************/

    /* TCU错误帧请求 */
    static con_tcu_error_t con_tcu_error[CON_MAX_PORT_NUM];

    /*************************************************************************************************************************************************/

protected:
    void run() Q_DECL_OVERRIDE;

private:
    bool m_quit;
    bool m_open;
    unsigned long m_cycle = 250;

    qint16 ota_send_id_ = 0;
    qint32 ota_send_size_ = 0;
    qint32 ota_length_;
    QByteArray ota_data_;
    unsigned long ota_cycle_ = 10;

    static int heartbeat_count_;

private:
    quint16 CheckCRC();

signals:

public slots:
    void StartUpdate(qint32 subversion, qint32 revision, qint32 packLength, qint32 checkSum, QString updateType);

private slots:

};

#endif // CONTROLLER_H
